import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * 在一个线程池中，会先创建一定数量的线程（根据`corePoolSize`设置），
 * 这些线程会一直存在并等待任务。当有新的任务提交到线程池时，会根据当前线程池的状态来处理任务：
 * 1. 如果当前线程数未达到`corePoolSize`，会创建新的线程来处理任务；
 * 2. 如果当前线程数已经达到了`corePoolSize`，新的任务会被添加到任务队列中等待执行；
 * 3. 当任务队列也达到了上限，且当前线程数未达到`maxPoolSize`，会创建新的线程来处理任务；
 * 4. 如果线程数已经达到了`maxPoolSize`，新的任务无法被处理，可能会根据配置采取拒绝策略。
 * 这样的线程池设计可以根据实际情况动态地管理线程数量，
 * 避免无限制地创建线程和处理任务，提高系统的性能和稳定性。
 */
public class MyThreadPool {
    private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);
    private int maxPoolSize = 0;
    private List<Thread> ThreadList = new ArrayList<>();

    // 初始化线程池 (FixedThreadPool)
    public MyThreadPool(int corePollSize, int maxPollSize){
        this.maxPoolSize = maxPollSize;
        // 创建若干个线程
        for (int i = 0; i < corePollSize; i++) {
            Thread t = new Thread(() ->{
                Runnable runnable = null;
                try {
                    runnable = queue.take();
                    runnable.run();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
            t.start();
            //将每个新创建的线程对象t添加到threadList列表中。
            ThreadList.add(t);
        }
    }
// 把任务添加到线程池中
    void submit(Runnable runnable) throws InterruptedException{
        // 此处进行判定, 判定说当前任务队列的元素个数, 是否比较长.
        // 如果队列元素比较长, 说明已有的线程, 不太能处理过来了. 创建新的线程即可.
        // 如果队列不是很长, 没必要创建新的线程.
        queue.put(runnable);
        if (queue.size() > 500 && ThreadList.size() < maxPoolSize){
            // 创建新的线程即可
            Thread T = new Thread(() ->{
                while (true){
                    try {
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            T.start();
        }
    }
}
